package intelligentCustomer.reasoning;

import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;

import java.util.HashMap;
import java.util.Map;

/**
 * 解决方案生成步骤
 * 基于需求识别和相关知识生成解决方案
 */
public class SolutionGenerationStep implements ReasoningStep {
    /** 大语言模型 */
    private final ChatLanguageModel model;
    
    /** 提示模板 */
    private static final PromptTemplate PROMPT_TEMPLATE = PromptTemplate.from(
        "基于以下信息，生成最佳解决方案。\n" +
        "用户查询: {{query}}\n" +
        "需求识别: {{needs}}\n" +
        "相关知识: {{knowledge}}\n" +
        "用户偏好: {{preferences}}\n\n" +
        "请提供详细的解决方案，包括:\n" +
        "1. 推荐的产品或服务\n" +
        "2. 解决方案的理由\n" +
        "3. 可能的替代方案\n" +
        "4. 实施步骤\n\n" +
        "以JSON格式返回结果，包含以上四个字段。"
    );
    
    /**
     * 构造函数
     * 
     * @param model 大语言模型
     */
    public SolutionGenerationStep(ChatLanguageModel model) {
        this.model = model;
    }
    
    /**
     * 执行解决方案生成步骤
     * 
     * @param context 推理上下文
     */
    @Override
    public void execute(ReasoningContext context) {
        try {
            // 获取需求识别结果
            String needs = (String) context.getAttribute("needsIdentification");
            if (needs == null) {
                context.setSuccessful(false);
                context.addReasoningStep(getName(), "无法获取需求识别结果");
                return;
            }
            
            // 准备提示参数
            Map<String, Object> variables = new HashMap<>();
            variables.put("query", context.getQuery());
            variables.put("needs", needs);
            variables.put("knowledge", context.getRelevantKnowledge());
            variables.put("preferences", String.join(", ", context.getUserProfile().getProductPreferences()));
            
            // 生成提示
            Prompt prompt = PROMPT_TEMPLATE.apply(variables);
            
            // 调用模型生成解决方案
            String solution = model.generate(prompt.text());
            
            // 将解决方案添加到推理链
            context.addReasoningStep(getName(), solution);
            
            // 将解决方案存储到上下文
            context.setAttribute("solution", solution);
            context.setSolution(solution);
            
            // 更新置信度
            context.setConfidence(context.getConfidence() * 0.9);
        } catch (Exception e) {
            context.setSuccessful(false);
            context.addReasoningStep(getName(), "解决方案生成失败: " + e.getMessage());
        }
    }
    
    /**
     * 获取步骤名称
     * 
     * @return 步骤名称
     */
    @Override
    public String getName() {
        return "解决方案生成";
    }
} 